<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rcutree.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/rcutree.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/*</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> * Read-Copy Update mechanism for mutual exclusion (tree-based version)</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> *</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> * This program is free software; you can redistribute it and/or modify</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> * it under the terms of the GNU General Public License as published by</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> * the Free Software Foundation; either version 2 of the License, or</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> * (at your option) any later version.</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> *</span>
<a name="9" /><span class="True">       9:</span> <span class="k"> * This program is distributed in the hope that it will be useful,</span>
<a name="10" /><span class="True">      10:</span> <span class="k"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="11" /><span class="True">      11:</span> <span class="k"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="12" /><span class="True">      12:</span> <span class="k"> * GNU General Public License for more details.</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> *</span>
<a name="14" /><span class="True">      14:</span> <span class="k"> * You should have received a copy of the GNU General Public License</span>
<a name="15" /><span class="True">      15:</span> <span class="k"> * along with this program; if not, write to the Free Software</span>
<a name="16" /><span class="True">      16:</span> <span class="k"> * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</span>
<a name="17" /><span class="True">      17:</span> <span class="k"> *</span>
<a name="18" /><span class="True">      18:</span> <span class="k"> * Copyright IBM Corporation, 2008</span>
<a name="19" /><span class="True">      19:</span> <span class="k"> *</span>
<a name="20" /><span class="True">      20:</span> <span class="k"> * Author: Dipankar Sarma &lt;dipankar@in.ibm.com&gt;</span>
<a name="21" /><span class="True">      21:</span> <span class="k"> *       Paul E. McKenney &lt;paulmck@linux.vnet.ibm.com&gt; Hierarchical algorithm</span>
<a name="22" /><span class="True">      22:</span> <span class="k"> *</span>
<a name="23" /><span class="True">      23:</span> <span class="k"> * Based on the original work by Paul McKenney &lt;paulmck@us.ibm.com&gt;</span>
<a name="24" /><span class="True">      24:</span> <span class="k"> * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen.</span>
<a name="25" /><span class="True">      25:</span> <span class="k"> *</span>
<a name="26" /><span class="True">      26:</span> <span class="k"> * For detailed explanation of Read-Copy Update mechanism see -</span>
<a name="27" /><span class="True">      27:</span> <span class="k"> *    Documentation/RCU</span>
<a name="28" /><span class="True">      28:</span> <span class="k"> */</span>
<a name="29" /><span class="True">      29:</span> 
<a name="30" /><span class="True">      30:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X19MSU5VWF9SQ1VUUkVFX0hfMA__"><span class="b">__LINUX_RCUTREE_H</span></a>
<a name="31" /><span class="True">      31:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19MSU5VWF9SQ1VUUkVFX0hfMA__"><span class="b">__LINUX_RCUTREE_H</span></a>
<a name="32" /><span class="True">      32:</span> 
<a name="33" /><span class="True">      33:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_note_context_switch</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="34" /><span class="True">      34:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">rcu_needs_cpu</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">delta_jiffies</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="True">      35:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_cpu_stall_reset</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="36" /><span class="True">      36:</span> 
<a name="37" /><span class="True">      37:</span> <span class="k">/*</span>
<a name="38" /><span class="True">      38:</span> <span class="k"> * Note a virtualization-based context switch.  This is simply a</span>
<a name="39" /><span class="True">      39:</span> <span class="k"> * wrapper around rcu_note_context_switch(), which allows TINY_RCU</span>
<a name="40" /><span class="True">      40:</span> <span class="k"> * to save a few bytes.</span>
<a name="41" /><span class="True">      41:</span> <span class="k"> */</span>
<a name="42" /><span class="True">      42:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">rcu_virt_note_context_switch</span><span class="f">(</span><span class="m">int</span> <span class="b">cpu</span><span class="f">)</span>
<a name="43" /><span class="True">      43:</span> <span class="f">{</span>
<a name="44" /><span class="True">      44:</span>     <span class="b">rcu_note_context_switch</span><span class="f">(</span><span class="b">cpu</span><span class="f">)</span><span class="f">;</span>
<a name="45" /><span class="True">      45:</span> <span class="f">}</span>
<a name="46" /><span class="True">      46:</span> 
<a name="47" /><span class="True">      47:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">synchronize_rcu_bh</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="48" /><span class="True">      48:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">synchronize_sched_expedited</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="49" /><span class="True">      49:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">synchronize_rcu_expedited</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="50" /><span class="True">      50:</span> 
<a name="51" /><span class="True">      51:</span> <span class="m">void</span> <span class="b">kfree_call_rcu</span><span class="f">(</span><span class="m">struct</span> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a> <span class="f">*</span><span class="b">head</span><span class="f">,</span> <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">func</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <a href="cpu.c_macros_ref.html#_cmN1X2hlYWRfMA__"><span class="b">rcu_head</span></a> <span class="f">*</span><span class="b">rcu</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="52" /><span class="True">      52:</span> 
<a name="53" /><span class="True">      53:</span> <span class="k">/**</span>
<a name="54" /><span class="True">      54:</span> <span class="k"> * synchronize_rcu_bh_expedited - Brute-force RCU-bh grace period</span>
<a name="55" /><span class="True">      55:</span> <span class="k"> *</span>
<a name="56" /><span class="True">      56:</span> <span class="k"> * Wait for an RCU-bh grace period to elapse, but use a &quot;big hammer&quot;</span>
<a name="57" /><span class="True">      57:</span> <span class="k"> * approach to force the grace period to end quickly.  This consumes</span>
<a name="58" /><span class="True">      58:</span> <span class="k"> * significant time on all CPUs and is unfriendly to real-time workloads,</span>
<a name="59" /><span class="True">      59:</span> <span class="k"> * so is thus not recommended for any sort of common-case code.  In fact,</span>
<a name="60" /><span class="True">      60:</span> <span class="k"> * if you are using synchronize_rcu_bh_expedited() in a loop, please</span>
<a name="61" /><span class="True">      61:</span> <span class="k"> * restructure your code to batch your updates, and then use a single</span>
<a name="62" /><span class="True">      62:</span> <span class="k"> * synchronize_rcu_bh() instead.</span>
<a name="63" /><span class="True">      63:</span> <span class="k"> *</span>
<a name="64" /><span class="True">      64:</span> <span class="k"> * Note that it is illegal to call this function while holding any lock</span>
<a name="65" /><span class="True">      65:</span> <span class="k"> * that is acquired by a CPU-hotplug notifier.  And yes, it is also illegal</span>
<a name="66" /><span class="True">      66:</span> <span class="k"> * to call this function from a CPU-hotplug notifier.  Failing to observe</span>
<a name="67" /><span class="True">      67:</span> <span class="k"> * these restriction will result in deadlock.</span>
<a name="68" /><span class="True">      68:</span> <span class="k"> */</span>
<a name="69" /><span class="True">      69:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">synchronize_rcu_bh_expedited</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="70" /><span class="True">      70:</span> <span class="f">{</span>
<a name="71" /><span class="True">      71:</span>     <span class="b">synchronize_sched_expedited</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="72" /><span class="True">      72:</span> <span class="f">}</span>
<a name="73" /><span class="True">      73:</span> 
<a name="74" /><span class="True">      74:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_barrier</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="75" /><span class="True">      75:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_barrier_bh</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="76" /><span class="True">      76:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_barrier_sched</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="77" /><span class="True">      77:</span> 
<a name="78" /><span class="True">      78:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">rcutorture_testseq</span><span class="f">;</span>
<a name="79" /><span class="True">      79:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">rcutorture_vernum</span><span class="f">;</span>
<a name="80" /><span class="True">      80:</span> <span class="m">extern</span> <span class="m">long</span> <span class="b">rcu_batches_completed</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="81" /><span class="True">      81:</span> <span class="m">extern</span> <span class="m">long</span> <span class="b">rcu_batches_completed_bh</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="82" /><span class="True">      82:</span> <span class="m">extern</span> <span class="m">long</span> <span class="b">rcu_batches_completed_sched</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="83" /><span class="True">      83:</span> 
<a name="84" /><span class="True">      84:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_force_quiescent_state</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="85" /><span class="True">      85:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_bh_force_quiescent_state</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="86" /><span class="True">      86:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_sched_force_quiescent_state</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="87" /><span class="True">      87:</span> 
<a name="88" /><span class="True">      88:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">exit_rcu</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="89" /><span class="True">      89:</span> 
<a name="90" /><span class="True">      90:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">rcu_scheduler_starting</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="91" /><span class="True">      91:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">rcu_scheduler_active</span> <a href="cpu.c_macros_ref.html#_X19yZWFkX21vc3RseV8w"><span class="b">__read_mostly</span></a><span class="f">;</span>
<a name="92" /><span class="True">      92:</span> 
<a name="93" /><span class="True">      93:</span> <span class="m">extern</span> <span class="m">bool</span> <span class="b">rcu_is_watching</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="94" /><span class="True">      94:</span> 
<a name="95" /><span class="True">      95:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* __LINUX_RCUTREE_H */</span>
<a name="96" /><span class="True">      96:</span> </pre>
  </body>
</html>
